import org.intellij.markdown.ast.ASTNode
import org.intellij.markdown.flavours.MarkdownFlavourDescriptor
import org.intellij.markdown.flavours.gfm.GFMFlavourDescriptor
import org.intellij.markdown.parser.MarkdownParser

const val MARKDOWN_TEXT = """
# 最大的标题

## 次级标题

### 小一点的标题

#### 再小一点的标题

##### 更小的标题

###### 最小的标题

加粗 **加粗**，斜体 *斜体* ~~删除线~~

嵌套:

*这是 **加粗** 的斜体文本*

**这是 *斜体* 的加粗文本**

这是 `java`，这是 `Golang`，这是 `Rust`，No 这是 `Markdown`。

This is a <sub>subscript</sub> text

\u003e 这是一个引用块。
\u003e 可以包含多个段落。
\u003e 引用可以嵌套哦，比如：\u003e\u003e 这是嵌套引用。

1. 有序列表项一
2. 有序列表项二
   - 无序列表项一
   - 无序列表项二
3. 有序列表项三

- 无序列表项一
- 无序列表项二
  1. 有序列表嵌套一
  2. 有序列表嵌套二

- [ ] 未完成的任务列表项
- [x] 已完成的任务列表项

`这是一行内联代码`

```python
# 这是一段代码块
def hello_world():
    print(\"Hello, World!\")
```

[这是一个链接](http://www.example.com)

![这是一个图片](http://www.example.com/image.png)

---

这是一条水平线

---

| 表头1 | 表头2 | 表头3 |
|-------|-------|-------|
| 单元格 | 单元格 | 单元格 |
| 单元格 | 单元格 | 单元格 |

- 列表项一
  - 嵌套列表项一
  - 嵌套列表项二
- 列表项二

```mermaid
graph TD
    A[方形] --\u003e B((圆形))
    A --\u003e C(圆角方形)
    B --\u003e D{菱形}
    C --\u003e D
"""

fun main() {
    val markdownParser = MarkdownParser(GFMFlavourDescriptor()).buildMarkdownTreeFromString(MARKDOWN_TEXT.trimIndent())
    markdownParser.children.forEach {
        printType("", it)
    }
}

fun printType(prefix: String = "", astNode: ASTNode) {
    println(prefix + astNode.type + " " + astNode.javaClass)
    astNode.children.forEach {
        printType(prefix + "  ", it)
    }
}